#ifndef __16CD4409_8CB2_4740_9195_5EFE8B02B4BB__
#define __16CD4409_8CB2_4740_9195_5EFE8B02B4BB__

#include "../msg/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos
{
    //  
    // callback interface
    // 
    class i_runnable;

    // 
    // i_aio interface
    // 
    class i_aio
    {
    public:
        enum enumAioType
        {
            AIO_NONE,

            AIO_TCP_INIT_SERVER_RET,
            AIO_TCP_INIT_SERVER,
            AIO_TCP_CONNECT_RET,
            AIO_TCP_CONNECT,
            AIO_TCP_ACCPET_RET,
            AIO_TCP_ACCPET,
            AIO_TCP_RECV_RET,
            AIO_TCP_RECV,
            AIO_TCP_SEND_RET,
            AIO_TCP_SEND,
            AIO_TCP_CLOSE_HANDLE_RET,
            AIO_TCP_CLOSE_HANDLE,

            AIO_UDP_INIT_RET,
            AIO_UDP_INIT,
            AIO_UDP_RECV_RET,
            AIO_UDP_RECV,
            AIO_UDP_SEND_RET,
            AIO_UDP_SEND,
            AIO_UDP_CLOSE_HANDLE_RET,
            AIO_UDP_CLOSE_HANDLE
        };

    public:
        virtual ~i_aio(){}

    public:
        // 
        // set callback. 
        // 
        virtual int set_callback( i_callback * pCallbackThread, i_runnable * pCallback ) = 0;

        // 
        // post aio request
        // 
        virtual int post_request( i_msg * lpRequest ) = 0;

        // 
        // release
        // 
        virtual int release() = 0;
    };

    // 
    // dispatch aio event.user can impl this interface in user_data.
    // in i_aio_callback::aio_callback( i_msg * lpData ),
    // can get user_data from i_msg,then call
    // i_dispatch_aio_event::dispatch_aio_event()
    // to dispatch event.
    // 
    // this is only a proposal.you can use any method.
    // 
    class i_dispatch_aio_event
    {
    public:
        virtual ~i_dispatch_aio_event(){}

    public:
        // 
        // dispatch aio event
        // 
        virtual int dispatch_aio_event( i_msg * lpData ) = 0;
    };

}

#endif // __16CD4409_8CB2_4740_9195_5EFE8B02B4BB__
